SIGNAL

#include <signal.h>
int (*signal(sig, func)();
int sig;                           значение сигнала
int (*func)();                     выполняемая функция

Описание.
Функция signal позволяет выбрать из операционной системы один из трех способов обработки сигнала прерывания. Аргумент sig может быть одной из манифестных констант SIGINT или SIGFPE , определеных в <signal.h> . Манифестная константа SIGINT соответствует в MS DOS сигналу прерывания INT 23H . SIGFPE соответствует прерываниям плавающей точки, которые не маскированы, такие как переполнение, деление на ноль, неверная операция. Аргумент func может быть одной из манифестных констант SIG_DFL или SIG_IGN (также определенных в <signal.h> ), или адресом функции. При получении сигнала прерывания принимаемое действие зависит от значения func и является следующим:

            
         ЗНАЧЕНИЕ                           ЕГО СМЫСЛ
            
         SIG_IGN           Сигнал   прерывания  игнорируется.  Это
                           значение для SIGFPE не задается,   т.к.
                           состояние  процесса  с плавающей точкой
                           остается неопределенным.
                           
         SIG_DFL           Вызванный процесс завершен;  управление
                           передается   на  уровень команд MS DOS.
                           Все файлы, открытые в процессе,  закры-
                           ваются, но буферы не обновляются.
                           
         Адрес функции     Для сигналов SIGINT функции, на которую
                           указывает func,  передается    аргумент
                           SIGINT и она выполняется. Если  функция
                           завершается нормально, прерванный  про-
                           цесс возобновляет выполнение с команды,
                           следующей за той, в которой был получен
                           сигнал  прерывания.  Перед  выполнением
                           специфицированной функции значение func
                           устанавливается  в  SIG_DFL;  следующий
                           сигнал прерывания трактуется как и  для
                           SIG_DFL,  если  внешний  вызов  signal,
                           задающий другое значение прерывания, не
                           определен.  Это  позволяет пользователю
                           переустанавливать сигналы  в вызываемых
                           функциях, если необходимо. Для   SIGFPE
                           функциц,   на  которую  указывает func,
                           передаются два аргумента - SIGFPE и це-
                           лый подкод ошибки,  FPE-xxx-,  и  затем
                           она выполняется. (Смотрите include-файл
                           <float.h>   для   определения  подкодов
                           FPE-xxx.)     Значение     func      не
                           переустановится  до  тех  пор,  пока не
                           будет  получен  сигнал прерывания;  для
                           выхода  из  состояния  плавающей  точки
                           используется  setjmp  вместе  с longjmp
                           (см. пример  для функции_fprset).  Если
                           функция завершается нормально, прерван-
                           ный    процесс     возобновляется     в
                           неопределенном    состоянии   плавающей
                           точки.

Возвращаемое значение.
Функция signal возвращает предыдущее значение func . Возвращаемое значение -1 свидетельствует об ошибке и errno устанавливается в EINVAL , определяя неверное значение sig .

Замечание:
В тех child -процессах, которые созданы посредством вызова процедур exec или spawn , установленные сигналы прерываний не сохраняются. Эти сигналы в child-процессе переустанавливаются по умолчанию.

Пример:

            
            #include <stdio.h>
            #include <signal.h>
            #include <stdlib.h>
            #include <process.h>
            int handler();
            
            main()
                  {
                  if(signal(SIGINT, handler)==(int(*)())-1) {
                      fprintf(stderr,"couldn't set SIGINT\n");
                      abort();
                      }
                      .
        
         
                      .
                      .
                  }
            
            int handler()
                  {
                  char ch;
                  printf("terminate processing? ");
           
                  scanf("%1c", &ch);
                  if (ch=='y' ::ch=='Y')
                        exit(0);
                  signal(SIGINT, handler);
                  }
            
               /* функция signal, вызванная здесь для  следующего  сигнала
         прерываний, посылает управление не в ОС, а к handler() */
            
           
Hosted by uCoz